﻿#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>




//函数指针变量的创建     
// 类比整型指针
// 函数指针变量应该是⽤来存放函数地址的，未来通过地址能够调⽤函数的
// 
// 
//
//void test()
//{
//	printf("hehe\n");
//}
//int main()
//{
//	printf("test:  %p\n", test);
//	printf("&test: %p\n", &test);
//	return 0;
//}

//如果我们要将函数的地址存放起来，就得创建函数指针变量咯，函数指针变量的写法其实和数组指针⾮常类似

//大概写法便是
//void test()
//{
//	printf("hehe\n");
//}
//void (*pf1)() = &test;   //这两种写法都可以，实际上函数名便是一个地址
//void (*pf2)() = test;
//int Add(int x, int y)
//{
//	return x + y;
//}
//int(*pf3)(int, int) = Add;
//int(*pf3)(int x, int y) = &Add; 

//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int main()
//{
//
//	int	(*pf)(x, y) = Add;
//	printf("%d \n", pf(3, 4));
//	printf("%d\n", (*pf)(2, 3));  //两者是相同的
//
//
//
//
//	return 0;
//
//}

//下面有两段有趣的代码

//(*(void (*)())0)();
//这是对0进行强制指针转换，对0这个地址解引用对于的函数进行使用




//void (*signal(int , void(*)(int)))(int);
//这实际上是一个函数的声明
//函数的声明格式为  ： int Add(int,int)
//需要有返回值类型，函数名，行参
//上面的signal(int , void(*)(int)）
//便是一个函数名和形参，而返回类型呢？
//之前学到指针类型，指针的返回类型，举个例子 ：int* a ，返回值类型为 int*
// 函数指针呢？     int(*)(形参)
// 所以，可知函数的返回类型为void (*)(int); 
//
 //但是，这种写法显然很难看得明白


//所以有以下的知识点
//             typedef 关键字
//

//⽐如，你觉得unsigned int写起来不⽅便，如果能写成uint就⽅便多了，那么我们可以使⽤：
//typedef unsigned int uint;
//将unsigned int重命名为uint

//命名指针类型的
//typedef int* ptr_t;

//但是相对于数组指针和函数指针有点区别，这是语法规定的

//typedef int(*parr_t)[5]; //新的类型名必须在*的右边
//而不是 typedef int(*)[5]parr_t


//函数指针类似，也得在*右边
//typedef void(*pfun_t)(int);

//那么简化一下刚刚的第二个有趣代码
//typedef void(*psig_t)(int);
//所以刚刚代码就会变成
// void (*signal(int , void(*)(int)))(int);
//pisg_t signal(int, psig_t);







//函数指针数组
//int (*parr1[3])(); 
